package gemsa.modeles;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import gemsa.beans.Reponse;
import gemsa.beans.LigneProjet;
import gemsa.outils.GestionBaseDeDonnees;

/**
 * Classe ModeleLigneProjet
 * @author Projet Dev Groupe 33
 * @version 1.0
 */
 
public class ModeleLigneProjet 
{
	// Variables
	DataSource datasource=null;
	Connection connexion=null;
	ResultSet resultat=null;
	
	// Constructeur
	public ModeleLigneProjet(DataSource datasource)
	{		
		this.datasource=datasource;
	}
	
	// Lister les projets
	public List<LigneProjet> listerLigneProjet(int idProjet)
	{
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		LigneProjet ligneProjet=null;
		List<LigneProjet> listeLigneProjet=null;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			    	
	      	// Création de la requête
	    	requeteString="SELECT * FROM ligneprojet WHERE id_projet = ?";
	    			
	    	// Pr�paration de la requête
	    	requete=connexion.prepareStatement(requeteString);
	    	requete.setInt(1, idProjet);
	    	    	
	    	// Execution de la requête
	    	resultat=requete.executeQuery();
	    	
	    	// Initialisation de la liste des lignes projets
	    	listeLigneProjet=new ArrayList<LigneProjet>();
	    	
	    	// On stocke le resultat dans une liste de ligneProjet
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					ligneProjet = ligneProjetAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste des lignes du projet
					listeLigneProjet.add(ligneProjet);
				}
			}
			
			// On annule l'id par sécurité
			idProjet=0;
		}
		catch(Exception e)
		{
			System.out.println("Erreur dans la requete dans la classe ModeleLigneProjet fonction listerLigneProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleLigneProjet fonction listerLigneProjet");
			}	
		}
		
		// Retourner la liste des lignes projets
		return listeLigneProjet;
	}
	
	
	// Ajouter une ligne
	public int ajouterListeLigneProjet(List<LigneProjet> listeLigneProjet,int idProjet)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		LigneProjet ligneProjet=null;
		int codeErreur=1;
		int compteur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Annulation de l'autocommit
			connexion.setAutoCommit(false);
			
	        // Chaque ligne du projet est ajoutée � la base de données
	        while(compteur<listeLigneProjet.size() && codeErreur==1)
	        {
	          	// On r�cup�re la ligne
	           	ligneProjet=listeLigneProjet.get(compteur);
	            	
	           	// Création de la requête
	    		requeteString = "INSERT INTO ligneprojet (id_question,id_projet,coefficient) VALUES(?,?,?)";
	    			
	    		// Préparation de la requête
	    		requete=connexion.prepareStatement(requeteString);
	    		requete.setInt(1, ligneProjet.getReponse().getId());
	    		requete.setInt(2, idProjet);
	    		requete.setDouble(3, ligneProjet.getCoefficient());
	            	
	    		// Execution de la requête
	    		codeErreur=requete.executeUpdate();
	    			
	    		// Incrémentation
	    		compteur++;
			}
			
			// Si il y a une erreur durant l'ajout des lignes du projet en base, on fait un rollback
			if(codeErreur!=1)
			{
				GestionBaseDeDonnees.rollback(connexion);
			}
			else
			{
				GestionBaseDeDonnees.commit(connexion);
			}
			
			// On vide la la liste de ligneProjet par sécurité
			listeLigneProjet=null;
		}
		catch(Exception e)
		{
			codeErreur=0;
			GestionBaseDeDonnees.rollback(connexion);
			System.out.println("Erreur dans la requete dans la classe ModeleLigneProjet fonction ajouterListeLigneProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleLigneProjet fonction ajouterListeLigneProjet");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	
	// Réaliser la transformation Relationnel vers Objet
	private LigneProjet ligneProjetAttributsMapper(ResultSet resultat)
	{
		// Variables
		LigneProjet ligneProjet=null;
		ModeleReponseProjet modeleReponse=null;
		
		// Initialisation du modèle
		modeleReponse=new ModeleReponseProjet(this.datasource);
		
		// Initalisation de l'objet projet
		ligneProjet=new LigneProjet();
		
		try
		{	
			// On renseigne l'objet ligneProjet
			if(resultat.getString("id_ligneprojet")==null)
			{
				ligneProjet.setId(0);
			}
			else
			{
				ligneProjet.setId(resultat.getInt("id_ligneprojet"));
			}
			
			if(resultat.getString("id_question")==null)
			{
				ligneProjet.setReponse(new Reponse());
			}
			else
			{
				ligneProjet.setReponse(modeleReponse.getReponse(resultat.getInt("id_question")));
			}
			
			if(resultat.getString("coefficient")==null)
			{
				
				ligneProjet.setCoefficient(0);
			}
			else
			{
				ligneProjet.setCoefficient(resultat.getDouble("coefficient"));
			}
			
		}
		catch (Exception e) 
		{
			// Si il y a une erreur durant le mappage des attributs avec la base on renvoie un objet null
			ligneProjet=null;
			System.out.println("Erreur lors du mappage des attributs d'un questions dans la classe ModeleReponse fonction ReponseAttributsMapper");
		}
		
		// On retourne le projet
		return ligneProjet;
	}
	
	
	
}
